Mocks¶

Des fois, nous ne sommes pas capable d'isoler nos functions¶

  1. La fonction ne fait que du input/output

  2. La fonction dépend de libraries merdiques

  3. Il serait compliquer de tout découpler

Exercices¶

  • Écrire une fonction qui prend en argument un url ainsi qu'un nom de fichier et qui télécharge l'url dans le fichier.

  • Tester la fonction

truc

  • utiliser l'url https://httpbin.org/get

  • utiliser la librarie requests

  • il n'y a pas de trucs ici, il faut faire du IO :(

In [8]:
import requests
from pathlib import Path
from shutil import copyfileobj

def download_to_file(url: str, dest: Path) -> None:
    with requests.get(url, stream=True) as resp:
        resp.raise_for_status()
        with open(dest, 'wb') as file_:
        copyfileobj(resp.raw, file_)


download_to_file("https://httpbin.org/get", Path("/") / "tmp" / "foo")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[8], line 10
      6         resp.raise_for_status()
      7         print(resp.file)
---> 10 download_to_file("https://httpbin.org/get", Path("/") / "tmp" / "foo")

Cell In[8], line 7, in download_to_file(url, file_)
      5 with requests.get(url, stream=True) as resp:
      6     resp.raise_for_status()
----> 7     print(resp.file)

AttributeError: 'Response' object has no attribute 'file'

Que pouvons nous faire dans cette situation là?¶

  1. Utilisé du IO mais très restraint (pas toujours possible)

  2. Mocker

Python mock¶

  • Python possède une des meilleur libraries pour faire des mocks

  • https://docs.python.org/3/library/unittest.mock.html